import java.awt.*; // 导入 AWT（Abstract Window Toolkit）和 Swing 组件类
import java.awt.event.*; // 导入 AWT 事件类
import javax.swing.*; // 导入 Swing 组件类

public class calculator extends JFrame implements ActionListener { // 继承 JFrame 类并实现 ActionListener 接口
    private JTextField inputField; // 输入框
    private JButton button0, button1, button2, button3, button4, button5,
            button6, button7, button8, button9, buttonAdd, buttonSub,
            buttonMult, buttonDiv, buttonEqual, buttonClear, buttonSqrt,
            buttonBin, buttonOct, buttonHex, buttonSin, buttonCos, buttonTan; // 按钮
    private double num1, num2, result; // 存储数字和结果
    private String operator; // 存储运算符
    private boolean operatorPressed = false; // 标志运算符是否被按下

    public calculator() { // 构造函数
        // 设置窗口属性
        setTitle("Calculator"); // 设置窗口标题
        setSize(400, 500); // 设置窗口大小
        setLocationRelativeTo(null); // 设置窗口位置
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口时的操作

        // 创建组件
        inputField = new JTextField(); // 创建输入框

        // 创建数字按钮
        button0 = new JButton("0");
        button1 = new JButton("1");
        button2 = new JButton("2");
        button3 = new JButton("3");
        button4 = new JButton("4");
        button5 = new JButton("5");
        button6 = new JButton("6");
        button7 = new JButton("7");
        button8 = new JButton("8");
        button9 = new JButton("9");

        // 创建运算符按钮
        buttonAdd = new JButton("+");
        buttonSub = new JButton("-");
        buttonMult = new JButton("*");
        buttonDiv = new JButton("/");
        buttonEqual = new JButton("=");
        buttonClear = new JButton("C");
        buttonSqrt = new JButton("√");

        // 创建进制转换按钮
        buttonBin = new JButton("Bin");
        buttonOct = new JButton("Oct");
        buttonHex = new JButton("Hex");

        // 创建三角函数按钮
        buttonSin = new JButton("sin");
        buttonCos = new JButton("cos");
        buttonTan = new JButton("tan");

        // 设置组件属性
        inputField.setEditable(false); // 设置输入框不可编辑
        inputField.setFont(new Font("Arial", Font.PLAIN, 24)); // 设置字体大小和样式
        inputField.setHorizontalAlignment(JTextField.RIGHT); // 设置文本右对齐

        Font buttonFont = new Font("Arial", Font.BOLD, 20); // 设置按钮字体和样式
        button0.setFont(buttonFont);
        button1.setFont(buttonFont);
        button2.setFont(buttonFont);
        button3.setFont(buttonFont);
        button4.setFont(buttonFont);
        button5.setFont(buttonFont);
        button6.setFont(buttonFont);
        button7.setFont(buttonFont);
        button8.setFont(buttonFont);
        button9.setFont(buttonFont);
        buttonAdd.setFont(buttonFont);
        buttonSub.setFont(buttonFont);
        buttonMult.setFont(buttonFont);
        buttonDiv.setFont(buttonFont);
        buttonEqual.setFont(buttonFont);
        buttonClear.setFont(buttonFont);
        buttonSqrt.setFont(buttonFont);
        buttonBin.setFont(buttonFont);
        buttonOct.setFont(buttonFont);
        buttonHex.setFont(buttonFont);
        buttonSin.setFont(buttonFont);
        buttonCos.setFont(buttonFont);
        buttonTan.setFont(buttonFont);

        // 给按钮添加 ActionListener
        button0.addActionListener(this);
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
        button4.addActionListener(this);
        button5.addActionListener(this);
        button6.addActionListener(this);
        button7.addActionListener(this);
        button8.addActionListener(this);
        button9.addActionListener(this);
        buttonAdd.addActionListener(this);
        buttonSub.addActionListener(this);
        buttonMult.addActionListener(this);
        buttonDiv.addActionListener(this);
        buttonEqual.addActionListener(this);
        buttonClear.addActionListener(this);
        buttonSqrt.addActionListener(this);
        buttonBin.addActionListener(this);
        buttonOct.addActionListener(this);
        buttonHex.addActionListener(this);
        buttonSin.addActionListener(this);
        buttonCos.addActionListener(this);
        buttonTan.addActionListener(this);

        // 添加组件到窗口
        JPanel buttonPanel = new JPanel(new GridLayout(6, 4, 10, 10)); // 创建一个面板，使用网格布局
        buttonPanel.add(buttonBin); // 添加进制转换按钮
        buttonPanel.add(buttonOct);
        buttonPanel.add(buttonHex);
        buttonPanel.add(buttonClear); // 添加清除按钮
        buttonPanel.add(buttonSin); // 添加三角函数按钮
        buttonPanel.add(buttonCos);
        buttonPanel.add(buttonTan);
        buttonPanel.add(buttonSqrt); // 添加平方根按钮
        buttonPanel.add(button7); // 添加数字按钮
        buttonPanel.add(button8);
        buttonPanel.add(button9);
        buttonPanel.add(buttonDiv); // 添加除法按钮
        buttonPanel.add(button4);
        buttonPanel.add(button5);
        buttonPanel.add(button6);
        buttonPanel.add(buttonMult); // 添加乘法按钮
        buttonPanel.add(button1);
        buttonPanel.add(button2);
        buttonPanel.add(button3);
        buttonPanel.add(buttonSub); // 添加减法按钮
        buttonPanel.add(button0);
        buttonPanel.add(new JLabel()); // 占位符，用于保持布局对齐
        buttonPanel.add(buttonEqual); // 添加等于按钮
        buttonPanel.add(buttonAdd); // 添加加法按钮

        setLayout(new BorderLayout(10, 10)); // 设置窗口布局
        add(inputField, BorderLayout.NORTH); // 将输入框添加到窗口的北侧
        add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗口的中央
    }

    public void actionPerformed(ActionEvent e) { // 实现 ActionListener 接口中的方法
        String buttonText = e.getActionCommand(); // 获取按钮文本

        if (buttonText.equals("C")) { // 如果是清除按钮
            inputField.setText(""); // 清空输入框
            num1 = 0; // 将 num1 初始化为 0
            num2 = 0; // 将 num2 初始化为 0
            operator = null; // 将运算符初始化为 null
            operatorPressed = false; // 将 operatorPressed 初始化为 false
        } else if (buttonText.equals("+") || buttonText.equals("-") ||
                buttonText.equals("*") || buttonText.equals("/")) { // 如果是运算符按钮
            if (!operatorPressed) { // 如果运算符还没有被按下
                num1 = Double.parseDouble(inputField.getText()); // 获取输入框中的数字
                operator = buttonText; // 存储运算符
                inputField.setText(""); // 清空输入框
                operatorPressed = true; // 将 operatorPressed 设置为 true
            }
        } else if (buttonText.equals("sin") || buttonText.equals("cos") ||
                buttonText.equals("tan")) { // 如果是三角函数按钮
            num1 = Double.parseDouble(inputField.getText()); // 获取输入框中的数字
            if (buttonText.equals("sin")) { // 如果是 sin 按钮
                result = Math.sin(Math.toRadians(num1)); // 计算 sin(num1)
            } else if (buttonText.equals("cos")) { // 如果是 cos 按钮
                result = Math.cos(Math.toRadians(num1)); // 计算 cos(num1)
            } else if (buttonText.equals("tan")) { // 如果是 tan 按钮
                result = Math.tan(Math.toRadians(num1)); // 计算 tan(num1)
            }
            inputField.setText(Double.toString(result)); // 将结果显示在输入框中
        } else if (buttonText.equals("√")) { // 如果是平方根按钮
            num1 = Double.parseDouble(inputField.getText()); // 获取输入框中的数字
            result = Math.sqrt(num1); // 计算平方根
            inputField.setText(Double.toString(result)); // 将结果显示在输入框中
        } else if (buttonText.equals("Bin") || buttonText.equals("Oct") ||
                buttonText.equals("Hex")) { // 如果是进制转换按钮
            num1 = Double.parseDouble(inputField.getText()); // 获取输入框中的数字
            if (buttonText.equals("Bin")) { // 如果是二进制转换按钮
                inputField.setText(Integer.toBinaryString((int) num1)); // 将数字转换为二进制字符串并显示在输入框中
            } else if (buttonText.equals("Oct")) { // 如果是八进制转换按钮
                inputField.setText(Integer.toOctalString((int) num1)); // 将数字转换为八进制字符串并显示在输入框中
            } else if (buttonText.equals("Hex")) { // 如果是十六进制转换按钮
                inputField.setText(Integer.toHexString((int) num1)); // 将数字转换为十六进制字符串并显示
            }
        } // 判断按钮文本是否为 "="
        else if (buttonText.equals("=")) {
            // 如果已经按下了运算符按钮
            if (operatorPressed) {
                // 获取第二个数字
                num2 = Double.parseDouble(inputField.getText());
                // 根据之前按下的运算符计算结果
                if (operator.equals("+")) {
                    result = num1 + num2;
                } else if (operator.equals("-")) {
                    result = num1 - num2;
                } else if (operator.equals("*")) {
                    result = num1 * num2;
                } else if (operator.equals("/")) {
                    result = num1 / num2;
                }
                // 在输入框中显示计算结果
                inputField.setText(Double.toString(result));
                // 运算符按钮已经按下过，重置状态
                operatorPressed = false;
            }
        }
// 如果按钮文本不是 "="，则将其添加到输入框中
        else {
            inputField.setText(inputField.getText() + buttonText);
        }
    }
    public static void main(String[] args) {
        calculator calculator = new calculator();
        calculator.setVisible(true);
    }
}